//请设计一个机械累加器，计算从 1、2... 一直累加到目标数值 target 的总和。注意这是一个只能进行加法操作的程序，不具备乘除、if-else、
//switch-case、for 循环、while 循环，及条件判断语句等高级功能。 
//
// 
//
// 示例 1： 
//
// 
//输入: target = 5
//输出: 15
// 
//
// 示例 2： 
//
// 
//输入: target = 7
//输出: 28
// 
//
// 
//
// 提示： 
//
// 
// 1 <= target <= 10000 
// 
//
// 
//
// Related Topics 位运算 递归 脑筋急转弯 👍 658 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2025-05-25 23:32:58
 * @description LCR 189.设计机械累加器
 */
public class Qiu12nLcof{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 Qiu12nLcof fun=new Qiu12nLcof();
	 	 Solution solution = fun.new Solution();

	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {

		 //（1+target)target/2=target/2+target*target/2
		 public int mechanicalAccumulator1(int target) {
			 boolean flag = target > 0 && (target += mechanicalAccumulator(target - 1)) > 0;
			 return target;
		 }
		int[] test=new int[]{0};
		public int mechanicalAccumulator(int n) {
			try{
				return test[n];
			}catch(Exception e){
				return n+mechanicalAccumulator(n-1);
			}
		}
	//（1+target)target/2=target/2+target*target/2
	// target 二进制展开最多不会超过 14 位，我们手动展开 14 层代替循环即可  将两个数相乘用加法和位运算来模拟
	//任意两个数A×B可以分解为：
	// A × B = A × (b0×2^0 + b1×2^1 + ... + bn×2^n)
	//      = (A×b0)×2^0 + (A×b1)×2^1 + ... + (A×bn)×2^n
	//位运算关键操作：
	//B & 1：获取B的最低位（判断奇偶）
	//B >> 1：将B右移一位（相当于除以2）
	//A << 1：将A左移一位（相当于乘以2）
	public int mechanicalAccumulator2(int target) {
		int ans = 0, A = target, B = target + 1;
		boolean flag;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		flag = ((B & 1) > 0) && (ans += A) > 0;
		A <<= 1;
		B >>= 1;

		return ans >> 1;
	}

}
//leetcode submit region end(Prohibit modification and deletion)

}
